package online.heycm.decimal;

import java.math.BigDecimal;

/**
 * Decimal计算
 *
 * @author heycm
 * @version 1.0
 * @date 2021-04-24 12:34
 */
public class DecimalUtils {

    public static final BigDecimal ZORE = new BigDecimal("0");
    public static final BigDecimal ONE = new BigDecimal("1");

    //	留小数位数
    private static final int SCALE = 2;
    //	四舍五入
    private static final int ROUND_HALF_UP = BigDecimal.ROUND_HALF_UP;

    /**
     * 	加法： 所有参数相加
     * @return 和
     */
    public static BigDecimal add(BigDecimal... decimals) {
        if (decimals.length <= 1){
            throw new RuntimeException("BigDecimal lacks parameters for addition!");
        }
        BigDecimal res = decimals[0];
        for (int i = 1; i < decimals.length; i++) {
            res = res.add(decimals[i]);
        }
        return res;
    }

    /**
     * 	减法： 第一个参数为被减数，其余为减数
     * @return 差
     */
    public static BigDecimal subtract(BigDecimal... decimals) {
        if (decimals.length <= 1){
            throw new RuntimeException("BigDecimal lacks parameters for subtraction!");
        }
        BigDecimal res = decimals[0];
        for (int i = 1; i < decimals.length; i++){
            res = res.subtract(decimals[i]);
        }
        return res;
    }

    /**
     * 	乘法： 所有参数相乘
     * @return 积
     */
    public static BigDecimal multiply(BigDecimal... decimals) {
        if (decimals.length <= 1){
            throw new RuntimeException("BigDecimal lacks parameters for multiplication!");
        }
        BigDecimal res = decimals[0];
        for (int i = 1; i < decimals.length; i++){
            res = res.multiply(decimals[i]);
        }
        return res.setScale(SCALE, ROUND_HALF_UP);
    }

    /**
     * 	除法： 第一个参数为被除数，其余为除数(保留两位小数)
     * @return 商
     */
    public static BigDecimal divide(BigDecimal... decimals) {
        if (decimals.length <= 1){
            throw new RuntimeException("BigDecimal lacks parameters for division!");
        }
        BigDecimal res = decimals[0];
        for (int i = 1; i < decimals.length; i++){
            res = res.divide(decimals[i], SCALE, ROUND_HALF_UP);
        }
        return res;
    }

    /**
     * 除法
     * scale: 保留小数位数
     * decimals: 第一个参数为被除数，其余为除数
     * @return 商
     */
    public static BigDecimal divide(int scale, BigDecimal... decimals) {
        if (decimals.length <= 1){
            throw new RuntimeException("BigDecimal lacks parameters for division!");
        }
        BigDecimal res = decimals[0];
        for (int i = 1; i < decimals.length; i++){
            res = res.divide(decimals[i], scale, ROUND_HALF_UP);
        }
        return res;
    }


    /**
     * 在数字上比较a等于b
     * @param a
     * @param b
     * @return boolean
     * @author HY
     * @createTime: 2020-12-04 10:26:16
     * @updateTime:
     */
    public static boolean eq(BigDecimal a, BigDecimal b) {
        return a.compareTo(b) == 0;
    }

    /**
     * 在数字上比较a大于b
     * @param a
     * @param b
     * @return boolean
     * @author HY
     * @createTime: 2020-12-04 10:20:51
     * @updateTime:
     */
    public static boolean ge(BigDecimal a, BigDecimal b) {
        return a.compareTo(b) == 1;
    }

    /**
     * 在数字上比较a小于b
     * @param a
     * @param b
     * @return boolean
     * @author HY
     * @createTime: 2020-12-04 10:20:51
     * @updateTime:
     */
    public static boolean le(BigDecimal a, BigDecimal b) {
        return a.compareTo(b) == -1;
    }

    /**
     * 在数字上比较a大于等于b
     * @param a
     * @param b
     * @return boolean
     * @author HY
     * @createTime: 2020-12-04 10:27:07
     * @updateTime:
     */
    public static boolean gt(BigDecimal a, BigDecimal b) {
        return a.compareTo(b) > -1;
    }

    /**
     * 在数字上比较a小于等于b
     * @param a
     * @param b
     * @return boolean
     * @author HY
     * @createTime: 2020-12-04 10:27:07
     * @updateTime:
     */
    public static boolean lt(BigDecimal a, BigDecimal b) {
        return a.compareTo(b) < 1;
    }

    /**
     * 	四舍五入保留两位小数
     * @param number
     * @return BigDecimal
     * @author HY
     * @createTime: 2020-12-15 10:10:16
     * @updateTime:
     */
    public static BigDecimal round(String number) {
        return round(SCALE, number);
    }

    /**
     * 	四舍五入保留scale位小数
     * @param scale
     * @param number
     * @return BigDecimal
     * @author HY
     * @createTime: 2020-12-15 10:12:25
     * @updateTime:
     */
    public static BigDecimal round(int  scale, String number) {
        return new BigDecimal(number).setScale(scale, ROUND_HALF_UP);
    }

}
